03Singleton
单例模式(Singleton)
确保某一个类只有一个实例, 而且自行实例化并向整个系统提供这个实例。
意图: 希望只拥有一个对象, 但不用全局对象来控制对象的实例化。
问题: 几个不同的客户对象需要引用同样的对象, 你希望确保自己拥有的这 种对象不超过一个。
一个全局使用的类频繁地创建与销毁。当您想控制实例数目,节省系统资源的时候。
实现:
- ①在 Singleton 中添加静态成员, 初始化为 NULL
- ②添加静态成员方法, 若静态成员变量为 NULL,则实始化并返回。
- ③将构造成员, 设为 private 或是 protected, 这样只能通过静态方法实例化。
构造函数是私有的。
应用实例:
- 2、Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。
- 3、一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。
- 1、要求生产唯一序列号。
- 2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。
- 3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。
优点:
- 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
- 2、避免对资源的多重占用(比如写文件操作)。
缺点: 没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
传统的方式,已经被private,不可用。
static方式 在类内部 保证了唯一性。
#include <iostream>
using namespace std;
//传统的方式,被private后, 传统的方式不可用。(A a ; new A)
//static func 唯一性
class Singleton
{
public:
static Singleton * getInstance()
{
if(_ins == nullptr)
_ins = new Singleton;
return _ins;
}
private:
static Singleton *_ins;
Singleton(){}
Singleton(const Singleton &){}
Singleton & operator =(const Singleton &){}
~Singleton(){}
};
Singleton *Singleton::_ins=nullptr;
int main()
{
Singleton *ps = Singleton::getInstance();
Singleton *ps2 = Singleton::getInstance();
if(ps==ps2)
cout<<"\n ps == ps2 "<<endl;
// Singleton s3(*ps);
return 0;
}